package ru.compft.app.as_db.business;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import ru.compft.common.data.AppAcl;
import ru.compft.common.data.AppPermission;
import ru.compft.common.data.AppRole;
import ru.compft.common.data.AppUser;
import ru.compft.common.exception.PermissionDeniedException;

import java.util.List;

/**
 * User: ASUS
 * Date: 28.10.12
 * Time: 11:01
 * Базовый интерфейс всех бизнес методов.
 * Нужен, чтоб осуществлять перехват методов и проверку на наличие прав на выполнения бизнес метода.
 * Перехват осуществляется через BusinessFacadeInterceptor
 */
public interface BusinessFacade {

    /**
     * Показать всех пользователей в БД
     *
     * @return
     * @throws PermissionDeniedException
     */
    List<AppUser> showAllUsers() throws PermissionDeniedException;

    /**
     * Показать страницу добавления пользователя
     *
     * @return
     * @throws PermissionDeniedException
     */
    boolean showAddUserPage() throws PermissionDeniedException;

    /**
     * Показать страницу редактирования пользователя
     *
     * @param userId
     * @return
     * @throws PermissionDeniedException
     */
    AppUser showEditUserPage(Long userId) throws PermissionDeniedException;

    /**
     * Показать страницу карточка пользователя
     *
     * @param userId
     * @return
     */
    AppUser showViewUserPage(Long userId) throws PermissionDeniedException;

    /**
     * Сохранение пользователя
     *
     * @param newUser
     * @return
     * @throws PermissionDeniedException
     */
    AppUser saveUser(AppUser newUser) throws PermissionDeniedException;

    /**
     * Показать все роли в БД
     *
     * @return
     * @throws PermissionDeniedException
     */
    List<AppRole> showAllRoles() throws PermissionDeniedException;

    /**
     * Показать страницу добавления роли
     *
     * @return
     * @throws PermissionDeniedException
     */
    boolean showAddRolePage() throws PermissionDeniedException;

    /**
     * Показать страницу редактирования роли
     *
     * @param roleId
     * @return
     * @throws PermissionDeniedException
     */
    AppRole showEditRolePage(Long roleId) throws PermissionDeniedException;

    /**
     * Показать страницу карточка роли
     *
     * @param roleId
     * @return
     */
    AppRole showViewRolePage(Long roleId) throws PermissionDeniedException;

    /**
     * Сохранение роли
     *
     * @param appRole
     * @return
     * @throws PermissionDeniedException
     */
    AppRole saveRole(AppRole appRole) throws PermissionDeniedException;

    /**
     * Показать все права доступа в БД
     *
     * @return
     * @throws PermissionDeniedException
     */
    List<AppPermission> showAllPermissions() throws PermissionDeniedException;

    /**
     * Показать страницу добавления права доступа
     *
     * @return
     * @throws PermissionDeniedException
     */
    boolean showAddPermissionPage() throws PermissionDeniedException;

    /**
     * Показать страницу редактирования права доступа
     *
     * @param permissionId
     * @return
     * @throws PermissionDeniedException
     */
    AppPermission showEditPermissionPage(Long permissionId) throws PermissionDeniedException;

    /**
     * Показать страницу карточка права доступа
     *
     * @param permissionId
     * @return
     */
    AppPermission showViewPermissionPage(Long permissionId) throws PermissionDeniedException;

    /**
     * Сохранение права доступа
     *
     * @param permission
     * @return
     * @throws PermissionDeniedException
     */
    boolean savePermission(AppPermission permission) throws PermissionDeniedException;

    /**
     * Очистка кеша
     * ACL кеш очищаем здесь, все остальное через сервисы
     *
     * @throws PermissionDeniedException
     */
    @CacheEvict(value = "acls", allEntries = true)
    void clearCache() throws PermissionDeniedException;

    /**
     * Список всех ACL записей для данного класса.
     * Данный ACL только для ролей
     *
     * @param clazz
     * @return
     */
    @Cacheable(value = "acls")
    List<AppAcl> getAclPermissionsForRole(String clazz) throws PermissionDeniedException;

    /**
     * Сохраняем все установленные права доступа
     * Очищаем кеш
     *
     * @param appAclList
     */
    @CacheEvict(value = "acls", allEntries = true)
    void saveAclPermissions(List<AppAcl> appAclList) throws PermissionDeniedException;
}
